package com.biz.primus.ms.commodity.dao.ro;

import com.biz.primus.base.enums.vendor.VendorType;
import com.biz.primus.base.redis.annotation.Ro;
import com.biz.primus.base.redis.annotation.RoSortedSet;
import com.biz.primus.base.redis.bean.BaseRedisObject;
import com.biz.primus.base.vo.ExtendProductVo;
import com.biz.primus.base.vo.commodity.SaleStatus;
import com.biz.primus.commodity.enums.UsageScenarios;
import com.biz.primus.commodity.vo.frontend.PropertyItemVo;
import com.biz.primus.commodity.vo.frontend.RapidProductItemVo;
import com.biz.primus.common.utils.JsonUtils;
import com.biz.primus.common.utils.StringTool;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.List;

/**
 * 商品 Ro
 * product:ProductRo:357488814006472709
 *
 * @author david-liu
 * @date 2016年12月30日
 * @reviewer
 * @see
 */
@NoArgsConstructor

@Data
@Ro(key = "product:ProductRo")
@RoSortedSet(key = "allProducts", score = "createTimestamp")
public class ProductRo extends BaseRedisObject<String> implements Serializable {

    private static final long serialVersionUID = 3047690150118104670L;

    /**
     * 商品类型
     */
    private Integer productType;

    /**
     * 商品 ID
     */
    private Long productId;

    /**
     * 商家 ID
     */
    private Long vendorId;

    /**
     * 商品编码
     */
    private String productCode;


    /**
     * 商品名
     */
    private String name;

    /**
     * 商品副标题
     */
    private String subTitle;

    /**
     * 副标题头
     */
    private String subHeadingMark;

    /**
     * 商品简介
     */
    private String breif;

    /**
     * 商品品牌 ID
     */
    private Long brandId;

    /**
     * 商品品牌名称
     */
    private String brandName;

    /**
     * 商品分类 ID
     */
    private Long categoryId;

    /**
     * 分类名称
     */
    private String categoryName;

    /**
     * 商品 Logo
     */
    private String logo;

    /**
     * 商品主图
     */
    private String images;

    /**
     * 商品详情图片
     */
    private String introImages;

    /**
     * 销售标签 ID (以逗号分割)
     */
    private String saleTagIds;

    /**
     * 商品扩展属性(存放PropertyItemVo List以Json序列化之后的字符串)
     *
     * @see PropertyItemVo
     */
    private String propertiesJson;

    /**
     * 灵活的商品扩展属性 jsonArray
     * @see ExtendProductVo
     */
    private String extendProduct;


    /**
     * 商品重量(单位: 克)
     */
    private Integer weight;

    /**
     * Seo 关键字
     */
    private String seoKeywords;

    /**
     * 上下架总开关
     *
     * @see SaleStatus
     */
    private Integer saleStatus;

    /**
     * web渠道
     *
     * @see SaleStatus
     */
    private Integer webSaleStatus;

    /**
     * app渠道
     * @see SaleStatus
     */
    private Integer appSaleStatus;

    /**
     * 商品可销售的区域
     */
    private String geoIds;

    /**
     * 商品平均评分
     */
    private Integer score;

    /**
     * 商品总评分
     */
    private Integer totalScore;

    /**
     * 商品评价总数
     */
    private Integer scoreCount;

    /**
     * 历史销量
     */
    private Integer salesVolume;

    /**
     * 点击量
     */
    private Integer viewVolume;

    /**
     * 上架时间
     */
    private Timestamp onSaleTime;

    /**
     * 是否是组合商品
     */
    private Boolean isRapidProduct = Boolean.FALSE;

    /**
     * 组合商品明细(以json字符串存储)
     */
    private String rapidProductInfo;

    /**
     * 使用场景
     */
    private UsageScenarios scence;

    /**
     * 快喝显示顺序
     */
    private Integer depotProductOrder;

    /**
     * 是否显示品牌店(快喝)
     */
    private Boolean showBrandStore = Boolean.FALSE;

    /**
     * 规格(快喝)
     */
    private String standard;

    /**
     * 库存提示值
     */
    private Integer promptStock;
    /**
     * 品牌店
     */
    private String brandStore;

    /**
     * 是否包邮(快喝)
     */
    private Boolean isKuaihePackageMail;

    /**
     * 件装数,规格商品使用
     */
    private Integer packageNumber;

    /**
     * 全局排序
     */
    private Integer globalIdx=9999;

    public Boolean getRapidProduct() {
        return isRapidProduct;
    }

    public Boolean isTypeA() {
        return this.productType != null && this.productType == VendorType.TYPE_A.getValue();
    }

    public List<String> getSaleTagIdsList() {
        return Optional.fromNullable(StringTool.split(saleTagIds, ",")).or(Lists.<String>newArrayList());
    }
    public List<RapidProductItemVo> getRapidProductInfoVo() {
        return StringUtils.isEmpty(rapidProductInfo) ? Lists.<RapidProductItemVo>newArrayList() : JsonUtils.json2Obj(rapidProductInfo,List.class,RapidProductItemVo.class);
    }

    public void setRapidProductInfo(String rapidProductInfo) {
        if (StringUtils.isEmpty(rapidProductInfo)) {
            this.rapidProductInfo = "";
        } else {
            this.rapidProductInfo = rapidProductInfo;
        }
    }

    public boolean isValid() {
        boolean isTypeValid = this.productType != null && (this.productType == VendorType.TYPE_A.getValue() || this.productType == VendorType.TYPE_B.getValue());
        boolean isWeightValid = this.weight != null && this.weight > 0;
        if (!isWeightValid) {
            this.weight = 0;
        }
        return isTypeValid;
    }

    public List<ExtendProductVo> getExtendProducts(){
        if (StringUtils.isNotBlank(this.extendProduct)){
            return JsonUtils.json2Obj(this.extendProduct,List.class,ExtendProductVo.class);
        }
        return Collections.EMPTY_LIST;
    }

    public ProductRo(String productCode) {
        this.setId(productCode);
    }
}
